
const a = 10; //值类型,在栈中开辟了一块新的空间,存储10
const b = a; //值类型,在栈中开辟了一块新的空间,将a的10拷贝一份存储在b中
console.log(a, b); //10 10

const obj = {
    name: '张三',
    age: 18,
}; //引用类型,在堆中开辟了一块新的空间,存储obj
const obj2 = obj; //引用类型,在栈中开辟了一块新的空间,将obj的内存地址存储在obj2中,两个不同空间存储相同的引用地址,指向同一个堆的空间
console.log(obj, obj2); //{ name: '张三', age: 18 } { name: '张三', age: 18 }

obj.name = '李四'; //由于obj和obj2指向同一个堆的空间,所以修改obj的name属性,obj2的name属性也会被修改
console.log(obj, obj2); //{ name: '李四', age: 18 } { name: '李四', age: 18 }

console.log('==============参数传递==============');

const fn = (a) => {  //这个方法是:接收一个值类型,在函数内部修改a的值
    a = 20;
    console.log(a); //20
};

fn(a); //调用函数,传递a的值
console.log(a); //10

const fn2 = (obj) => {
    obj.name = '王五'; //由于obj和obj2指向同一个堆的空间,所以修改obj的name属性,obj2的name属性也会被修改
    console.log(obj); //{ name: '王五', age: 18 }
};

fn2(obj); //调用函数,传递obj的值
console.log(obj); //{ name: '王五', age: 18 }


const fn3 = (obj) => {
    obj = { name: '赵六', age: 20 }; //这里重新赋值,obj指向了新的堆空间,所以不会影响外部的obj
    console.log(obj); //{ name: '赵六', age: 20 }
};

fn3(obj);
console.log(obj); //{ name: '王五', age: 18 }
